Coroutines এবং Asynchronous Programming
কটলিনে Coroutines হলো একটি অত্যাধুনিক ফিচার যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে আরও সহজ এবং কার্যকরী করে তোলে। Coroutines ব্যবহার করে আপনি দীর্ঘস্থায়ী অপারেশনগুলি (যেমন নেটওয়ার্ক কল, ফাইল I/O, ইত্যাদি) ব্যাকগ্রাউন্ড থ্রেডে পরিচালনা করতে পারেন এবং UI থ্রেডকে ব্লক না করে দ্রুত ফলাফল পেতে পারেন। নিচে Coroutines এবং Asynchronous Programming নিয়ে বিস্তারিত আলোচনা করা হলো:
১. Coroutines কি?
Coroutines হলো কটলিনের একটি লাইটওয়েট থ্রেড, যা কনকারেন্ট কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়। এটি সহজ এবং সোজা কোড লেখার সুযোগ দেয় যা বহুগুণে উন্নত পারফরম্যান্স প্রদান করে।
i) Coroutine এর সুবিধা
- লাইটওয়েট: Coroutines ফাইবারের মতো, যা একাধিক Coroutines একটি থ্রেডে চালাতে পারে।
- সহজ ব্যবহার: Coroutine লেখা সহজ এবং পাঠযোগ্য, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে কার্যকর করে তোলে।
- ব্লক না করা: Coroutines ব্যবহারের ফলে UI থ্রেড ব্লক হয় না, ফলে অ্যাপ্লিকেশন রেসপন্সিভ থাকে।
২. Coroutine শুরু করা
Coroutines ব্যবহারের জন্য আপনাকে kotlinx.coroutines লাইব্রেরি অন্তর্ভুক্ত করতে হবে।
i) Coroutine তৈরি করা
Coroutines তৈরি করতে launch এবং async ফাংশন ব্যবহার করা হয়।
উদাহরণ:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
// Coroutine body
delay(1000L) // Non-blocking delay for 1 second
println("Coroutine 1 finished")
}
launch {
delay(500L) // Non-blocking delay for 0.5 second
println("Coroutine 2 finished")
}
println("Started coroutines")
}
ব্যাখ্যা:
runBlockingহল একটি Coroutine Scope যা blocking nature কাজ করে।launchফাংশনটি একটি নতুন Coroutine তৈরি করে।delayফাংশনটি একটি Non-blocking বিলম্ব তৈরি করে।
৩. Asynchronous Programming
Asynchronous Programming হল এমন একটি প্রোগ্রামিং মডেল যেখানে কাজগুলি একযোগে চালানো হয়। এটি ব্যবহারকারীদের জন্য মসৃণ অভিজ্ঞতা তৈরি করতে সাহায্য করে, বিশেষ করে যখন সময়সাপেক্ষ অপারেশন সম্পাদন করা হয়।
i) Asynchronous Programming উদাহরণ
Coroutines ব্যবহার করে Asynchronous Programming এর মাধ্যমে সময়সাপেক্ষ কাজগুলো ব্যাকগ্রাউন্ডে চলতে পারে।
উদাহরণ:
import kotlinx.coroutines.*
suspend fun fetchData(): String {
delay(2000L) // Simulating a long-running task
return "Data fetched"
}
fun main() = runBlocking {
val data = async { fetchData() } // Asynchronous fetch
println("Fetching data...")
println(data.await()) // Wait for the result
}
ব্যাখ্যা:
fetchData()একটিsuspendফাংশন যা 2 সেকেন্ড বিলম্ব করে এবং কিছু ডেটা ফেরত দেয়।asyncব্যবহার করে Asynchronous টাস্ক শুরু হয় এবংawaitব্যবহার করে ফলাফল পাওয়া যায়।
৪. Coroutine Scope
Coroutines এর বিভিন্ন Scope আছে, যেমন GlobalScope, CoroutineScope, এবং runBlocking, যা নির্দিষ্ট সময়ে Coroutine কার্যক্রম পরিচালনা করতে সাহায্য করে।
i) CoroutineScope উদাহরণ
fun main() {
runBlocking {
launch {
delay(1000L)
println("Coroutine in runBlocking")
}
GlobalScope.launch {
delay(500L)
println("Coroutine in GlobalScope")
}
println("Main function")
}
}
ব্যাখ্যা:
- এখানে
runBlockingফাংশনের ভেতরেlaunchব্যবহার করা হয়েছে যা মূল থ্রেড ব্লক করে।GlobalScope.launchবাইরের Coroutine Scope তৈরি করে, যা ব্যবহারের পরে চলতে থাকে।
৫. Structured Concurrency
Coroutines কটলিনে Structured Concurrency অনুসরণ করে, যার মানে হল যে আপনি ফাংশনের ভেতরে তৈরি করা Coroutine গুলি যতক্ষণ না কাজ সম্পন্ন হয় ততক্ষণ অব্যাহত থাকবে।
উদাহরণ:
fun main() = runBlocking {
launch { // Child coroutine
delay(1000L)
println("Child Coroutine")
}
println("Main Coroutine")
}
ব্যাখ্যা:
- এখানে,
launchফাংশনে একটি Child Coroutine তৈরি করা হয়েছে যা Parent Coroutine (runBlocking) এর সাথে যুক্ত।
উপসংহার
কটলিনে Coroutines এবং Asynchronous Programming একটি শক্তিশালী উপায় প্রদান করে দীর্ঘস্থায়ী কার্যক্রম পরিচালনা করার জন্য। Coroutines দ্বারা অ্যাসিঙ্ক্রোনাস কোড লেখার প্রক্রিয়া সহজ হয় এবং কার্যকারিতা বাড়ে। কটলিনের এই ফিচারগুলি ব্যবহার করে আপনি দ্রুত এবং কার্যকরী অ্যাপ্লিকেশন তৈরি করতে পারবেন।
Coroutines কী এবং কেন ব্যবহার হয়
Coroutines হলো কটলিনের একটি শক্তিশালী ফিচার, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে সহজ এবং কার্যকরভাবে বাস্তবায়ন করতে সহায়ক। এটি দীর্ঘমেয়াদী এবং ব্লকিং কাজগুলিকে ব্যাকগ্রাউন্ডে চালানোর অনুমতি দেয়, ফলে ইউজার ইন্টারফেসে কোনো বিঘ্ন ছাড়াই অ্যাপ্লিকেশন আরও রেস্পন্সিভ থাকে। নিচে Coroutines এর ব্যবহার, সুবিধা এবং কিভাবে কাজ করে তা নিয়ে বিস্তারিত আলোচনা করা হলো।
১. Coroutines কি?
Coroutines হলো lightweight threads যা সহজে তৈরি এবং পরিচালনা করা যায়। এগুলো একাধিক কাজকে সমান্তরালে চালানোর জন্য ব্যবহার করা হয়, বিশেষ করে যখন আপনি IO অপারেশন, নেটওয়ার্কিং, বা দীর্ঘ সময়ের হিসাবের মতো কাজ করতে চান।
২. কেন Coroutines ব্যবহার হয়?
i) সহজ অ্যাসিঙ্ক্রোনাস কোড
Coroutines অ্যাসিঙ্ক্রোনাস কোড লেখা সহজ করে তোলে, যা সাধারণ Callback ভিত্তিক অ্যাসিঙ্ক্রোনাস কোডের তুলনায় আরও পরিষ্কার এবং পড়তে সহজ।
ii) ব্লকিং ছাড়া কাজ
Coroutines ইউজার ইন্টারফেসের সাথে সম্পর্কিত কাজগুলোকে ব্লক না করে ব্যাকগ্রাউন্ডে কাজ করতে দেয়। এটি অ্যাপ্লিকেশনকে আরো রেস্পন্সিভ এবং ব্যবহারকারীর জন্য উন্নত অভিজ্ঞতা প্রদান করে।
iii) কার্যকরী সম্পদ ব্যবহার
Coroutines অনেক কম সম্পদ ব্যবহার করে, কারণ তারা থ্রেডের তুলনায় অনেক বেশি হালকা। হাজার হাজার coroutines তৈরি করা সম্ভব, কিন্তু সেগুলোকে পরিচালনা করা সহজ।
iv) সোজা এবং পরিস্কার কোড
Coroutines এর মাধ্যমে লেখার সময় কোডের ফ্লো আরো স্পষ্ট হয়, যা ডেভেলপারদের জন্য debugging এবং maintenance সহজ করে।
৩. Coroutines কিভাবে কাজ করে?
Coroutines কটলিনের kotlinx.coroutines লাইব্রেরির মাধ্যমে কাজ করে। এর মাধ্যমে আপনি coroutines তৈরি এবং পরিচালনা করতে পারেন।
i) Coroutine Scope
Coroutines সাধারণত একটি CoroutineScope এর মধ্যে চালানো হয়। এই scope নির্ধারণ করে যে coroutine কিভাবে এবং কোথায় চালানো হবে।
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L) // 1 সেকেন্ড অপেক্ষা
println("World!")
}
println("Hello,") // এটি তাত্ক্ষণিকভাবে চলবে
}
ব্যাখ্যা:
- এখানে
runBlockingএকটি coroutine scope তৈরি করে যা মেইন থ্রেডকে ব্লক করে। launchএকটি নতুন coroutine তৈরি করে এবংdelayফাংশন ব্যবহারে 1 সেকেন্ড অপেক্ষা করে।
ii) Coroutine Builders
কটলিনে বিভিন্ন coroutine builders রয়েছে, যেমন:
launch: একটি coroutine শুরু করে, কিন্তু তার রিটার্ন ভ্যালু নয়।async: একটি coroutine শুরু করে এবং তার রিটার্ন ভ্যালু হিসেবেDeferredপ্রদান করে, যা ভবিষ্যতের মান নির্দেশ করে।
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferredResult = async {
delay(1000L) // 1 সেকেন্ড অপেক্ষা
42 // একটি মান রিটার্ন করে
}
println("The answer is: ${deferredResult.await()}") // আউটপুট: The answer is: 42
}
ব্যাখ্যা:
- এখানে
asynccoroutine তৈরি করে এবং তার রিটার্ন ভ্যালু হিসেবে একটিDeferredপ্রদান করে, যাawait()এর মাধ্যমে মূল্যায়িত হয়।
৪. Exception Handling in Coroutines
Coroutines-এ exception handling এর জন্য try-catch ব্লক ব্যবহার করা হয়।
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
launch {
throw Exception("An error occurred!")
}
} catch (e: Exception) {
println("Caught exception: ${e.message}")
}
}
ব্যাখ্যা:
- এখানে
launchcoroutine এর মধ্যে একটি exception ছোঁড়া হয়েছে, যাtry-catchব্লকে ধরা হয়েছে।
৫. Structured Concurrency
Coroutines কটলিনে Structured Concurrency ধারণা অনুসরণ করে, যার মানে হলো coroutine-এর জীবনচক্র একটি নির্দিষ্ট স্কোপের ভিতরে সীমাবদ্ধ থাকে। এটি অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে আরও সংগঠিত এবং সুনির্দিষ্ট করে।
উপসংহার
Coroutines কটলিনের একটি শক্তিশালী এবং কার্যকর ফিচার যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সহজ করে তোলে। এটি ইউজার ইন্টারফেসের স্থিতিশীলতা বজায় রাখার পাশাপাশি কোডের রিডেবিলিটি এবং কার্যকারিতা বাড়ায়। কটলিনের kotlinx.coroutines লাইব্রেরির মাধ্যমে coroutines তৈরি, পরিচালনা এবং exception handling করা সহজ।
Coroutine Builders (launch, async)
কটলিনে Coroutines ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং করা যায়, যা জাভা থ্রেডিংয়ের তুলনায় বেশি হালকা এবং কার্যকর। Coroutine Builders, যেমন launch এবং async, coroutine তৈরি করার জন্য ব্যবহৃত হয়। নিচে এই দুটি Coroutine Builder এর কার্যকারিতা এবং ব্যবহারের উদাহরণ নিয়ে বিস্তারিত আলোচনা করা হলো।
১. Coroutine Basics
কটলিনে Coroutine হলো একটি লাইটওয়েট থ্রেড যা অ্যাসিঙ্ক্রোনাস অপারেশন এবং ব্যাকগ্রাউন্ড টাস্ক সম্পাদনের জন্য ব্যবহৃত হয়। Coroutine ব্যবহার করে আপনি একটি সময়সীমার মধ্যে অনেক কাজ সম্পন্ন করতে পারেন, এবং এগুলো অন্যান্য থ্রেডের তুলনায় কম মেমরি ব্যবহার করে।
২. launch Coroutine Builder
launch Coroutine Builder একটি নতুন coroutine তৈরি করে এবং এটি একটি Job রিটার্ন করে। এটি সাধারণত এমন কাজের জন্য ব্যবহার করা হয় যেখানে আপনি একটি Coroutine তৈরি করতে চান এবং কিছু করার পরে ফলাফল ফেরত দেওয়ার প্রয়োজন নেই।
উদাহরণ:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L) // ১ সেকেন্ডের জন্য বিলম্বিত হবে
println("Coroutine finished!")
}
println("Hello,")
}
ব্যাখ্যা:
runBlockingএকটি coroutine scope তৈরি করে যা মেইন থ্রেড ব্লক করবে যতক্ষণ না এর সমস্ত coroutine সম্পন্ন হয়।launchCoroutine Builder ব্যবহার করে একটি নতুন coroutine তৈরি করা হয়েছে যা ১ সেকেন্ড বিলম্বিত হয়ে"Coroutine finished!"প্রিন্ট করবে।"Hello,"প্রিন্ট হবে প্রথমে, কারণ এটি Coroutine এর বাইরে।
৩. async Coroutine Builder
async Coroutine Builder একটি নতুন coroutine তৈরি করে এবং Deferred রিটার্ন করে। এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি ফলাফল প্রাপ্ত করতে চান। async-এর মাধ্যমে করা কাজটি শেষ হলে আপনি await ব্যবহার করে ফলাফল পেতে পারেন।
উদাহরণ:
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferredResult = async {
delay(1000L) // ১ সেকেন্ডের জন্য বিলম্বিত হবে
42 // ফলস্বরূপ মান
}
println("The answer is ${deferredResult.await()}") // আউটপুট: The answer is 42
}
ব্যাখ্যা:
- এখানে
asyncCoroutine Builder ব্যবহার করে একটি coroutine তৈরি করা হয়েছে যা ১ সেকেন্ড পরে ৪২ ফেরত দেবে। deferredResult.await()ব্যবহার করে coroutine এর কাজ শেষ হওয়ার পর ফলাফল পাওয়া যায়।
৪. launch এবং async এর মধ্যে পার্থক্য
| Features | launch | async |
|---|---|---|
| Return Type | Job | Deferred<T> |
| Purpose | Fire-and-forget tasks | To get a result |
| Usage | When you don't need a result | When you need a result |
৫. Structured Concurrency
কটলিনের coroutine ব্যবস্থাপনায় Structured Concurrency খুবই গুরুত্বপূর্ণ। এটি নিশ্চিত করে যে সমস্ত coroutine-এর সম্পন্ন হওয়া এবং ব্যবস্থাপনায় একটি পরিষ্কার ও নিরাপদ পদ্ধতি রয়েছে।
উদাহরণ:
import kotlinx.coroutines.*
fun main() = runBlocking {
// Multiple coroutines within the same scope
launch {
delay(500L)
println("Task from launch")
}
async {
delay(1000L)
println("Task from async")
}.await()
println("Main coroutine finished")
}
ব্যাখ্যা:
- এখানে
launchএবংasyncউভয়ই একইrunBlockingscope এর ভেতরে কাজ করছে। এটি নিশ্চিত করে যে মেইন coroutine শেষ না হওয়া পর্যন্ত সকল coroutine সম্পন্ন হবে।
উপসংহার
কটলিনের Coroutine Builders, যেমন launch এবং async, অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য একটি শক্তিশালী উপায় প্রদান করে। launch ব্যবহার করে আপনি সহজে Coroutine তৈরি করতে পারেন যখন ফলাফল প্রয়োজন হয় না, আর async ব্যবহার করে আপনি ফলাফল প্রাপ্ত করতে পারেন। এই ফিচারগুলো প্রোগ্রামিংকে আরও কার্যকর এবং সমন্বিত করে তোলে।
Suspending Functions এবং Await
কটলিনের Suspending Functions এবং Await হল Coroutines এর একটি গুরুত্বপূর্ণ অংশ, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের কার্যকারিতা বাড়ায়। Suspending Functions বিশেষভাবে ডিজাইন করা হয়েছে যাতে তারা অন্য Coroutine এর কাজ সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করতে পারে, এবং এটি UI থ্রেডকে ব্লক না করেই কাজ করে। নিচে Suspending Functions এবং Await নিয়ে বিস্তারিত আলোচনা করা হলো:
১. Suspending Functions
Suspending Functions হল এমন ফাংশন যা Coroutine এর ভিতরে ব্যবহৃত হতে পারে এবং একটি Coroutine এর কার্যক্রম সাসপেন্ড (অস্থায়ীভাবে থামানো) করতে পারে। এটি suspend কিওয়ার্ড দিয়ে চিহ্নিত করা হয়।
i) Suspending Functions তৈরি করা
Suspending Functions তৈরি করতে, আপনি ফাংশনের ডিক্লারেশনে suspend শব্দটি ব্যবহার করবেন।
উদাহরণ:
suspend fun fetchData(): String {
delay(2000L) // Simulating a long-running task
return "Data fetched"
}
ব্যাখ্যা:
- এখানে
fetchDataএকটি Suspending Function যা 2 সেকেন্ড বিলম্ব করে এবং পরে একটি স্ট্রিং রিটার্ন করে।
২. Suspending Functions ব্যবহার করা
Suspending Functions কেবল Coroutine ব্লকে অথবা অন্য Suspending Functions এর মধ্যে কল করা যেতে পারে।
ii) Suspending Functions এর ব্যবহার
import kotlinx.coroutines.*
fun main() = runBlocking {
val data = fetchData() // Calling the suspending function
println(data) // আউটপুট: Data fetched
}
ব্যাখ্যা:
- এখানে
runBlockingব্যবহার করে একটি Coroutine তৈরি করা হয়েছে এবংfetchDataফাংশনটি সেখানে কল করা হয়েছে।
৩. Await
Await ফাংশনটি Deferred অবজেক্টের জন্য ব্যবহৃত হয়, যা অ্যাসিঙ্ক্রোনাস কাজের ফলাফল ফেরত দেয়। যখন একটি async ব্লক ব্যবহার করে কাজ করা হয়, তখন await এর মাধ্যমে ফলাফল পাওয়া যায়।
i) Await ফাংশন ব্যবহার করা
উদাহরণ:
import kotlinx.coroutines.*
suspend fun fetchData1(): String {
delay(1000L)
return "Data 1 fetched"
}
suspend fun fetchData2(): String {
delay(1500L)
return "Data 2 fetched"
}
fun main() = runBlocking {
val deferred1 = async { fetchData1() } // Starting async operation
val deferred2 = async { fetchData2() } // Starting another async operation
// Waiting for both deferred results
println("${deferred1.await()}, ${deferred2.await()}")
// আউটপুট: Data 1 fetched, Data 2 fetched
}
ব্যাখ্যা:
- এখানে
asyncব্যবহার করেfetchData1এবংfetchData2দুইটি Suspending Function কে অ্যাসিঙ্ক্রোনাসভাবে কল করা হয়েছে। awaitব্যবহার করে আমরা ফলাফলগুলি প্রাপ্ত করেছি।awaitফাংশনটি ফলাফল পাওয়ার জন্য অপেক্ষা করে এবং এটি ব্লক না করে।
৪. Benefits of Suspending Functions and Await
- Non-blocking: Suspending Functions UI থ্রেডকে ব্লক না করে দীর্ঘস্থায়ী কার্যক্রম সম্পন্ন করতে সক্ষম।
- Code Readability: Suspending Functions ব্যবহার করে কোড লেখার সময় পারফরম্যান্স এবং রিডেবিলিটি বাড়ে।
- Efficient Resource Management:
awaitব্যবহার করে বিভিন্ন অ্যাসিঙ্ক্রোনাস কাজের ফলাফল সঠিকভাবে পরিচালনা করা যায়।
উপসংহার
কটলিনের Suspending Functions এবং Await Coroutines ব্যবহারের সময় কার্যকারিতা এবং পারফরম্যান্স বাড়াতে সাহায্য করে। Suspending Functions সঠিকভাবে কাজের কার্যক্রমকে সাসপেন্ড করে এবং await ফলাফলগুলো প্রাপ্ত করতে সহায়তা করে। এই ফিচারগুলি ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে আরও সহজ ও কার্যকরী করতে পারেন।
Coroutines কটলিনের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে সহজ করে। এর সঠিক ব্যবহারের জন্য Coroutine Scope এবং Coroutine Context এর ধারণা বোঝা খুবই জরুরি।
Coroutine Scope এবং Context
নিচে এদের সম্পর্কে বিস্তারিত আলোচনা করা হলো।
১. Coroutine Scope
Coroutine Scope একটি কনটেক্সট তৈরি করে যা নির্ধারণ করে coroutines কিভাবে এবং কোথায় চালানো হবে। এটি একটি coroutine-এর জীবনচক্র এবং ব্যবস্থাপনা পরিচালনা করে।
i) Scope এর ভূমিকা
- Lifecycle Management: Coroutine scope-এর মধ্যে তৈরি করা coroutines এর জীবনচক্র সেই scope-এর জীবনচক্রের সাথে যুক্ত থাকে। যখন scope শেষ হয়, তখন সেই scope-এর সব coroutine স্বয়ংক্রিয়ভাবে বাতিল হয়।
- Structured Concurrency: Coroutine scope structured concurrency কে সমর্থন করে, যা নিশ্চিত করে যে coroutines সঠিকভাবে সম্পন্ন হয় এবং resources সঠিকভাবে মুক্ত হয়।
ii) Coroutine Scope-এর উদাহরণ
import kotlinx.coroutines.*
fun main() = runBlocking { // runBlocking একটি coroutine scope
launch { // নতুন coroutine তৈরি
delay(1000L)
println("World!")
}
println("Hello,") // এটি তাত্ক্ষণিকভাবে চলবে
}
ব্যাখ্যা:
- এখানে
runBlockingএকটি coroutine scope তৈরি করেছে, যার ভিতরেlaunchব্যবহার করে একটি নতুন coroutine শুরু করা হয়েছে।runBlockingব্লকটি শেষ না হওয়া পর্যন্ত মেইন থ্রেড ব্লক থাকে।
২. Coroutine Context
Coroutine Context হলো একটি coroutine-এর সব তথ্য ধারণকারী একটি অবজেক্ট। এটি coroutine-এর বিভিন্ন বৈশিষ্ট্য যেমন, dispatcher, job, এবং coroutine name ধারণ করে।
i) Context-এর উপাদান
- Dispatcher: এটি নির্ধারণ করে coroutine কোন থ্রেডে চলবে। উদাহরণস্বরূপ,
Dispatchers.Main,Dispatchers.IO, এবংDispatchers.Default। - Job: এটি coroutine-এর জীবনচক্র নিয়ন্ত্রণ করে এবং এটিকে বাতিল করতে সক্ষম করে। আপনি একটি coroutine-এর সাথে একটি Job যুক্ত করতে পারেন।
- Coroutine Name: এটি coroutine-এর নাম নির্ধারণ করে, যা debugging এর জন্য সহায়ক হতে পারে।
ii) Coroutine Context-এর উদাহরণ
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch(Dispatchers.IO) { // IO dispatcher ব্যবহার করে coroutine শুরু
println("Running on thread: ${Thread.currentThread().name}")
}
job.join() // Coroutine সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন
}
ব্যাখ্যা:
- এখানে
launch(Dispatchers.IO)ব্যবহার করে coroutine তৈরি করা হয়েছে, যা IO কাজের জন্য উপযুক্ত।job.join()coroutine শেষ হওয়া পর্যন্ত অপেক্ষা করে।
৩. Coroutine Scope এবং Context এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Coroutine Scope | Coroutine Context |
|---|---|---|
| Definition | Coroutine-এর জীবনচক্র নির্ধারণ করে | Coroutine-এর বৈশিষ্ট্য এবং তথ্য ধারণ করে |
| Purpose | Structured concurrency এবং lifecycle management | Dispatcher, Job, Coroutine Name ইত্যাদি ধারণ করে |
| Usage | Coroutine তৈরি করার সময় scope ব্যবহৃত হয় | Coroutine তৈরি বা চালানোর সময় context নির্ধারণ করে |
৪. Coroutine Context এর সাথে Customization
আপনি নিজের coroutine context তৈরি করতে পারেন, যেখানে dispatcher, job, এবং অন্যান্য প্রোপার্টি অন্তর্ভুক্ত করা হয়।
উদাহরণ:
fun main() = runBlocking {
val customContext = Job() + Dispatchers.Default // Custom context তৈরি
val job = launch(customContext) {
println("Running on thread: ${Thread.currentThread().name}")
}
job.join() // Coroutine সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন
}
ব্যাখ্যা:
- এখানে
customContextতৈরি করা হয়েছে যাJobএবংDispatchers.Defaultএকত্রিত করেছে।
Coroutine Scope এবং Coroutine Context কটলিনে coroutines পরিচালনার জন্য গুরুত্বপূর্ণ। Scope coroutine-এর জীবনচক্র এবং ব্যবস্থাপনা নিশ্চিত করে, যেখানে Context coroutine-এর বিভিন্ন বৈশিষ্ট্য ধারণ করে। এই দুটির সঠিক ব্যবহার অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে আরও কার্যকর এবং সংগঠিত করে তোলে।
Read more